import { fileURLToPath, URL } from 'node:url'
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
// 浏览器兼容
import legacy from '@vitejs/plugin-legacy'
// API 自动引入
import AutoImport from 'unplugin-auto-import/vite'
//UI组件库自动引入
import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers'
// 组件自动引入
import Components from 'unplugin-vue-components/vite'
// 图标引入
import IconsResolver from 'unplugin-icons/resolver'
// iconfy
import Icons from 'unplugin-icons/vite'
// gzip
import viteCompression from 'vite-plugin-compression'
// 页面自动引入并生成对应路由
// import Pages from 'vite-plugin-pages'
// 该组件当前最新版本下的源码包存在问题，其对外声明的暴露方式与ts5.x的存在版本冲突问题，暂停使用，后续更新后可继续使用-2023/8/29
// import Layouts from 'vite-plugin-vue-layouts'
// html模板
import { createHtmlPlugin } from 'vite-plugin-html'
// 打包依赖分析
import { visualizer } from 'rollup-plugin-visualizer'

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const isProduction: any = loadEnv(mode, process.cwd()).VITE_ENV === 'production'
  return {
    plugins: [
      vue(),
      legacy({
        targets: ['defaults', 'not IE 11']
      }),
      AutoImport({
        include: [/\.[tj]sx?$/, /\.vue$/, /\.vue\?vue/, /\.md$/],
        // 插件预设导入的API
        imports: [
          'vue',
          'vue-router',
          'pinia',
          {
            // 其他工具API引入方式
            // '@vueuse/core': [
            //   // vueuse工具集的内容太多不适合全局引入，可以按照如下方式引入需要使用的hooks
            //   // named imports
            //   'useMouse', // import { useMouse } from '@vueuse/core',
            //   // alias
            //   ['useFetch', 'useMyFetch'] // import { useFetch as useMyFetch } from '@vueuse/core',
            // ]
          }
        ],
        resolvers: [AntDesignVueResolver()],
        vueTemplate: true,
        // 配置type文件生成位置
        dts: 'src/auto-imports.d.ts',
        eslintrc: {
          // 默认值为 `false`,设置为true时会生成下面的json文件，但是这个文件并不需要每次生成只需要第一次生成后即可，生成后设置为false就行，如果又新的插件引入可以改为true更新此文件，同时，需要将此文件加入到.gitignore中，不需要提交到git中
          enabled: false,
          filepath: './.eslintrc-auto-import.json', // Default `./.eslintrc-auto-import.json`
          globalsPropValue: true // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable')
        }
      }),
      Components({
        // 自定义组件所在文件夹，默认位置
        dirs: ['src/components'],
        resolvers: [AntDesignVueResolver(), IconsResolver()],
        extensions: ['vue'], //文件扩展
        // 配置type文件生成位置
        dts: 'src/components.d.ts'
      }),
      Icons({ autoInstall: true }),
      viteCompression({
        verbose: true,
        disable: false,
        threshold: 10240,
        algorithm: 'gzip',
        ext: '.gz'
      }),
      // Pages({
      //   dirs: 'src/views', // 需要生成路由的文件的目录
      //   exclude: ['**/components/*.vue'], // 排除在外的目录，将所有 components 目录下的 .vue 文件排除
      //   routeBlockLang: 'yaml',
      //   extendRoute(route, parent) {
      //     const { layout } = route.meta || {}
      //     if (layout) {
      //       route.meta.layout = () => import('@/layouts/' + layout + '.vue')
      //     }
      //   }
      // })
      // Layouts({
      //   layoutsDirs: 'src/layout', // 布局文件存放目录
      //   defaultLayout: 'index' // 默认布局，对应 src/layout/index.vue
      // }),
      createHtmlPlugin({
        minify: true,
        inject: {
          data: {
            injectConfig: isProduction
              ? '<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />'
              : '',
            webTitle: loadEnv(mode, process.cwd()).VITE_WEB_TITLE
          }
        }
      }),
      visualizer()
    ],
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url))
      }
    },
    base: './',
    server: {
      host: '0.0.0.0',
      open: true,
      proxy: {
        // 接口服务代理转发
        '/api': {
          target: 'https://mock.apifox.cn/m1/2832701-0-default/',
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, '')
        },
        '/ws': {
          target: 'ws://localhost:9092/',
          changeOrigin: true,
          ws: true,
          rewrite: (path) => path.replace(/^\/ws/, '')
        },
        '/mock': {
          target: 'https://mock.apifox.cn/m1/2832701-0-default/',
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/mock/, '')
        }
      }
    },
    build: {
      rollupOptions: {
        output: {
          chunkFileNames: 'static/js/[name]-[hash].js',
          entryFileNames: 'static/js/[name]-[hash].js',
          assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
          manualChunks(id) {
            if (id.includes('node_modules')) {
              return id.toString().split('node_modules/')[1].split('/')[0].toString()
            }
          }
        }
      },
      // minify: 'esbuild'
      minify: 'terser',
      terserOptions: {
        compress: {
          drop_console: true,
          drop_debugger: true
        }
      }
    },
    // esbuild: {
    //   drop: isProduction ? ['console', 'debugger'] : []
    // },
    css: {
      postcss: {
        plugins: [require('postcss-preset-env')]
      },
      preprocessorOptions: {
        less: {
          // 引入全局less变量文件
          // additionalData: `@import "@/style/variables.less";`
        }
      }
    }
  }
})
